package gin_extend

import (
	"net/url"

	"github.com/gin-gonic/gin"
)

func GetFullURL(c *gin.Context) string {
	baseUrl := GetBaseURL(c)
	// 获取路径和查询参数
	path := c.Request.URL.Path
	query := c.Request.URL.RawQuery

	// 构建完整URL
	fullURL := baseUrl + path
	if query != "" {
		fullURL += "?" + query
	}

	return fullURL
}

// GetRefererURL 获取调用API的页面的完整URL
// 从Referer头中获取调用页面的URL，如果Referer头不存在，则返回空字符串
func GetRefererURL(c *gin.Context) string {
	referer := c.Request.Header.Get("Referer")
	if referer == "" {
		// 如果Referer头不存在，也可以尝试从Origin头获取
		referer = c.Request.Header.Get("Origin")
	}
	return referer
}

// GetCallerPageURL 获取调用API的页面的完整URL（增强版）
// 优先使用Referer头，如果不存在则使用Origin头，如果都不存在则返回当前请求的URL
func GetCallerPageURL(c *gin.Context) string {
	// 优先从Referer头获取调用页面的URL
	referer := c.Request.Header.Get("Referer")
	if referer != "" {
		return referer
	}

	// 其次从Origin头获取
	origin := c.Request.Header.Get("Origin")
	if origin != "" {
		return origin
	}

	// 如果都没有，返回当前请求的URL（作为备选方案）
	return GetFullURL(c)
}

func GetBaseURL(c *gin.Context) string {
	scheme := getScheme(c)
	host := getHost(c)

	base := &url.URL{
		Scheme: scheme,
		Host:   host,
	}
	return base.String()
}

func getScheme(c *gin.Context) string {
	// 检查标准头部
	if scheme := c.GetHeader("X-Forwarded-Proto"); scheme != "" {
		return scheme
	}
	if scheme := c.GetHeader("X-Forwarded-Scheme"); scheme != "" {
		return scheme
	}

	// 检查非标准但常用的头部
	if scheme := c.GetHeader("X-Url-Scheme"); scheme != "" {
		return scheme
	}

	// 根据 TLS 判断
	if c.Request.TLS != nil {
		return "https"
	}

	return "http"
}

func getHost(c *gin.Context) string {
	// 检查代理头
	if host := c.GetHeader("X-Forwarded-Host"); host != "" {
		return host
	}
	if host := c.GetHeader("X-Original-Host"); host != "" {
		return host
	}

	// 回退到 Request.Host
	return c.Request.Host
}
